home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / ipv6.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  7KB  |  316 lines

  1. #ifndef _IPV6_H
  2. #define _IPV6_H
  3.  
  4. #include <linux/config.h>
  5. #include <linux/in6.h>
  6. #include <asm/byteorder.h>
  7.  
  8. /* The latest drafts declared increase in minimal mtu up to 1280. */
  9.  
  10. #define IPV6_MIN_MTU    1280
  11.  
  12. /*
  13.  *    Advanced API
  14.  *    source interface/address selection, source routing, etc...
  15.  *    *under construction*
  16.  */
  17.  
  18.  
  19. struct in6_pktinfo {
  20.     struct in6_addr    ipi6_addr;
  21.     int        ipi6_ifindex;
  22. };
  23.  
  24.  
  25. struct in6_ifreq {
  26.     struct in6_addr    ifr6_addr;
  27.     __u32        ifr6_prefixlen;
  28.     int        ifr6_ifindex; 
  29. };
  30.  
  31. #define IPV6_SRCRT_STRICT    0x01    /* this hop must be a neighbor    */
  32. #define IPV6_SRCRT_TYPE_0    0    /* IPv6 type 0 Routing Header    */
  33.  
  34. /*
  35.  *    routing header
  36.  */
  37. struct ipv6_rt_hdr {
  38.     __u8        nexthdr;
  39.     __u8        hdrlen;
  40.     __u8        type;
  41.     __u8        segments_left;
  42.  
  43.     /*
  44.      *    type specific data
  45.      *    variable length field
  46.      */
  47. };
  48.  
  49.  
  50. struct ipv6_opt_hdr {
  51.     __u8         nexthdr;
  52.     __u8         hdrlen;
  53.     /* 
  54.      * TLV encoded option data follows.
  55.      */
  56. };
  57.  
  58. #define ipv6_destopt_hdr ipv6_opt_hdr
  59. #define ipv6_hopopt_hdr  ipv6_opt_hdr
  60.  
  61. #ifdef __KERNEL__
  62. #define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
  63. #endif
  64.  
  65. /*
  66.  *    routing header type 0 (used in cmsghdr struct)
  67.  */
  68.  
  69. struct rt0_hdr {
  70.     struct ipv6_rt_hdr    rt_hdr;
  71.     __u32            bitmap;        /* strict/loose bit map */
  72.     struct in6_addr        addr[0];
  73.  
  74. #define rt0_type        rt_hdr.type
  75. };
  76.  
  77. struct ipv6_auth_hdr {
  78.     __u8  nexthdr;
  79.     __u8  hdrlen;           /* This one is measured in 32 bit units! */
  80.     __u16 reserved;
  81.     __u32 spi;
  82.     __u32 seq_no;           /* Sequence number */
  83.     __u8  auth_data[0];     /* Length variable but >=4. Mind the 64 bit alignment! */
  84. };
  85.  
  86. struct ipv6_esp_hdr {
  87.     __u32 spi;
  88.     __u32 seq_no;           /* Sequence number */
  89.     __u8  enc_data[0];      /* Length variable but >=8. Mind the 64 bit alignment! */
  90. };
  91.  
  92. struct ipv6_comp_hdr {
  93.     __u8 nexthdr;
  94.     __u8 flags;
  95.     __u16 cpi;
  96. };
  97.  
  98. /*
  99.  *    IPv6 fixed header
  100.  *
  101.  *    BEWARE, it is incorrect. The first 4 bits of flow_lbl
  102.  *    are glued to priority now, forming "class".
  103.  */
  104.  
  105. struct ipv6hdr {
  106. #if defined(__LITTLE_ENDIAN_BITFIELD)
  107.     __u8            priority:4,
  108.                 version:4;
  109. #elif defined(__BIG_ENDIAN_BITFIELD)
  110.     __u8            version:4,
  111.                 priority:4;
  112. #else
  113. #error    "Please fix <asm/byteorder.h>"
  114. #endif
  115.     __u8            flow_lbl[3];
  116.  
  117.     __u16            payload_len;
  118.     __u8            nexthdr;
  119.     __u8            hop_limit;
  120.  
  121.     struct    in6_addr    saddr;
  122.     struct    in6_addr    daddr;
  123. };
  124.  
  125. /*
  126.  * This structure contains configuration options per IPv6 link.
  127.  */
  128. struct ipv6_devconf {
  129.     __s32        forwarding;
  130.     __s32        hop_limit;
  131.     __s32        mtu6;
  132.     __s32        accept_ra;
  133.     __s32        accept_redirects;
  134.     __s32        autoconf;
  135.     __s32        dad_transmits;
  136.     __s32        rtr_solicits;
  137.     __s32        rtr_solicit_interval;
  138.     __s32        rtr_solicit_delay;
  139.     __s32        force_mld_version;
  140. #ifdef CONFIG_IPV6_PRIVACY
  141.     __s32        use_tempaddr;
  142.     __s32        temp_valid_lft;
  143.     __s32        temp_prefered_lft;
  144.     __s32        regen_max_retry;
  145.     __s32        max_desync_factor;
  146. #endif
  147.     __s32        max_addresses;
  148.     void        *sysctl;
  149. };
  150.  
  151. /* index values for the variables in ipv6_devconf */
  152. enum {
  153.     DEVCONF_FORWARDING = 0,
  154.     DEVCONF_HOPLIMIT,
  155.     DEVCONF_MTU6,
  156.     DEVCONF_ACCEPT_RA,
  157.     DEVCONF_ACCEPT_REDIRECTS,
  158.     DEVCONF_AUTOCONF,
  159.     DEVCONF_DAD_TRANSMITS,
  160.     DEVCONF_RTR_SOLICITS,
  161.     DEVCONF_RTR_SOLICIT_INTERVAL,
  162.     DEVCONF_RTR_SOLICIT_DELAY,
  163.     DEVCONF_USE_TEMPADDR,
  164.     DEVCONF_TEMP_VALID_LFT,
  165.     DEVCONF_TEMP_PREFERED_LFT,
  166.     DEVCONF_REGEN_MAX_RETRY,
  167.     DEVCONF_MAX_DESYNC_FACTOR,
  168.     DEVCONF_MAX_ADDRESSES,
  169.     DEVCONF_FORCE_MLD_VERSION,
  170.     DEVCONF_MAX
  171. };
  172.  
  173. #ifdef __KERNEL__
  174. #include <linux/in6.h>          /* struct sockaddr_in6 */
  175. #include <linux/icmpv6.h>
  176. #include <net/if_inet6.h>       /* struct ipv6_mc_socklist */
  177. #include <linux/tcp.h>
  178. #include <linux/udp.h>
  179.  
  180. /* 
  181.    This structure contains results of exthdrs parsing
  182.    as offsets from skb->nh.
  183.  */
  184.  
  185. struct inet6_skb_parm {
  186.     int            iif;
  187.     __u16            ra;
  188.     __u16            hop;
  189.     __u16            dst0;
  190.     __u16            srcrt;
  191.     __u16            dst1;
  192. };
  193.  
  194. #define IP6CB(skb)    ((struct inet6_skb_parm*)((skb)->cb))
  195.  
  196. /**
  197.  * struct ipv6_pinfo - ipv6 private area
  198.  *
  199.  * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc)
  200.  * this _must_ be the last member, so that inet6_sk_generic
  201.  * is able to calculate its offset from the base struct sock
  202.  * by using the struct proto->slab_obj_size member. -acme
  203.  */
  204. struct ipv6_pinfo {
  205.     struct in6_addr     saddr;
  206.     struct in6_addr     rcv_saddr;
  207.     struct in6_addr        daddr;
  208.     struct in6_addr        *daddr_cache;
  209.  
  210.     __u32            flow_label;
  211.     __u32            frag_size;
  212.     int            hop_limit;
  213.     int            mcast_hops;
  214.     int            mcast_oif;
  215.  
  216.     /* pktoption flags */
  217.     union {
  218.         struct {
  219.             __u8    srcrt:2,
  220.                     rxinfo:1,
  221.                 rxhlim:1,
  222.                 hopopts:1,
  223.                 dstopts:1,
  224.                                 rxflow:1;
  225.         } bits;
  226.         __u8        all;
  227.     } rxopt;
  228.  
  229.     /* sockopt flags */
  230.     __u8            mc_loop:1,
  231.                             recverr:1,
  232.                             sndflow:1,
  233.                 pmtudisc:2,
  234.                 ipv6only:1;
  235.  
  236.     struct ipv6_mc_socklist    *ipv6_mc_list;
  237.     struct ipv6_ac_socklist    *ipv6_ac_list;
  238.     struct ipv6_fl_socklist *ipv6_fl_list;
  239.     __u32            dst_cookie;
  240.  
  241.     struct ipv6_txoptions    *opt;
  242.     struct sk_buff        *pktoptions;
  243.     struct {
  244.         struct ipv6_txoptions *opt;
  245.         struct rt6_info    *rt;
  246.         int hop_limit;
  247.     } cork;
  248. };
  249.  
  250. /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
  251. struct raw6_sock {
  252.     /* inet_sock has to be the first member of raw6_sock */
  253.     struct inet_sock    inet;
  254.     __u32            checksum;    /* perform checksum */
  255.     __u32            offset;        /* checksum offset  */
  256.     struct icmp6_filter    filter;
  257.     /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */
  258.     struct ipv6_pinfo    inet6;
  259. };
  260.  
  261. struct udp6_sock {
  262.     struct udp_sock      udp;
  263.     /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */
  264.     struct ipv6_pinfo inet6;
  265. };
  266.  
  267. struct tcp6_sock {
  268.     struct tcp_sock      tcp;
  269.     /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */
  270.     struct ipv6_pinfo inet6;
  271. };
  272.  
  273. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
  274. static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
  275. {
  276.     return inet_sk(__sk)->pinet6;
  277. }
  278.  
  279. static inline struct raw6_sock *raw6_sk(const struct sock *sk)
  280. {
  281.     return (struct raw6_sock *)sk;
  282. }
  283.  
  284. static inline void inet_sk_copy_descendant(struct sock *sk_to,
  285.                        const struct sock *sk_from)
  286. {
  287.     int ancestor_size = sizeof(struct inet_sock);
  288.  
  289.     if (sk_from->sk_family == PF_INET6)
  290.         ancestor_size += sizeof(struct ipv6_pinfo);
  291.  
  292.     __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
  293. }
  294.  
  295. #define __ipv6_only_sock(sk)    (inet6_sk(sk)->ipv6only)
  296. #define ipv6_only_sock(sk)    ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
  297. #else
  298. #define __ipv6_only_sock(sk)    0
  299. #define ipv6_only_sock(sk)    0
  300.  
  301. static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
  302. {
  303.     return NULL;
  304. }
  305.  
  306. static inline struct raw6_sock *raw6_sk(const struct sock *sk)
  307. {
  308.     return NULL;
  309. }
  310.  
  311. #endif
  312.  
  313. #endif
  314.  
  315. #endif
  316.